import java.util.ArrayList;
import java.util.Iterator;
import org.apache.uima.*;
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.cas.FSArray;

import org.apache.uima.*;
import target.ts.SentenceWTKA;


public class SentenceWTKAAE extends JCasAnnotator_ImplBase {

       
        public void process(JCas aJCas) throws AnalysisEngineProcessException {
               
                //Récupération des types source soit TokenAnnotation et SentenceAnnotation
                Type typeToken = aJCas.getTypeSystem().getType("org.apache.uima.TokenAnnotation");
                Type typeSentence = aJCas.getTypeSystem().getType("org.apache.uima.SentenceAnnotation");
               
                //Récupération de l'ensemble des annotations de ces type
                AnnotationIndex sentencesIdx =
                       (AnnotationIndex) aJCas.getAnnotationIndex(typeSentence);
                AnnotationIndex tokensIdx =
                       (AnnotationIndex) aJCas.getAnnotationIndex(typeToken);
                //Création d'un itérateur sur l'index des Sentence
                FSIterator sentencesIt = sentencesIdx.iterator();
               
                while (sentencesIt.hasNext()) {
                       //Récupération de la sentence courante
                           SentenceAnnotation sent = (SentenceAnnotation) sentencesIt.next();
                       //Création d'un iterateur sur cette sentence
                       FSIterator tokensIt = tokensIdx.subiterator(sent);
                       //Création d'une SentenceWTKA
                       SentenceWTKA sentWTKA = new SentenceWTKA(aJCas);
                       sentWTKA.setBegin(sent.getBegin());
                       sentWTKA.setEnd(sent.getEnd());
                       //Celle-ci aura pour SentenceAnnotation la sentence courante
                       sentWTKA.setSentenceAnnotation(sent);
                       System.out.println("Sent-Text "+sent.getCoveredText()+" Begin "+sent.getBegin()+" End "+sent.getEnd());
                       //Définition de l'array de TokenAnnotations
                       ArrayList<TokenAnnotation> lst = new ArrayList<TokenAnnotation>();
                       while( tokensIt.hasNext() ) {
                           TokenAnnotation tA = (TokenAnnotation)tokensIt.next();
                           System.out.println("Token-Text "+tA.getCoveredText()+" Begin "+tA.getBegin()+" End "+tA.getEnd());
                           tA.addToIndexes();
                           lst.add(tA);
                        }
                       sentWTKA.setTokenArray(this.transform(lst, aJCas));
                       sentWTKA.addToIndexes();
                       }
                       
                }


public FSArray transform(ArrayList<TokenAnnotation> lst, JCas cas)
{
        // Transformation en tableau "statique"
        TokenAnnotation[] mETypes = lst.toArray(new TokenAnnotation[lst.size()]);
        // Création du FSArray
        FSArray mETypesFS = new FSArray(cas, mETypes.length);
        mETypesFS.copyFromArray(mETypes, 0, 0, mETypes.length);
       
        return mETypesFS;
}

}

